from datetime import datetime,timedelta
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin

db = SQLAlchemy()

class User(db.Model, UserMixin):
    # 用户模型，继承 db.Model 表示它是数据库模型，UserMixin 提供用户认证相关功能
    id = db.Column(db.Integer, primary_key=True)  # 用户 ID，整型，主键，自动生成唯一标识
    username = db.Column(db.String(150), unique=True, nullable=False)  # 用户名，字符串类型，最大长度150字符，必须唯一且不能为空
    password = db.Column(db.String(150), nullable=False)  # 密码，字符串类型，最大长度150字符，不能为空
    posts = db.relationship('Post', backref='author', lazy=True)
    # 用户与帖子模型的关系，一个用户可以有多篇帖子。backref 表示在 Post 模型中可以通过 `author` 字段反向访问到此用户。
    lazy=True #表示加载相关数据时不会立即加载，而是在第一次使用数据时才加载，提升性能
    is_admin = db.Column(db.Boolean, default=False)
    # 是否为管理员，布尔值，默认值为 False（非管理员），设为 True 则为管理员身份

    def __init__(self, username, password, is_admin=False):
        self.username = username
        self.password = password
        self.is_admin = is_admin


class Post(db.Model):
    # 帖子模型，继承 db.Model
    id = db.Column(db.Integer, primary_key=True)  # 帖子 ID，整型，主键，自动生成唯一标识
    title = db.Column(db.String(1500), nullable=False)  # 帖子标题，字符串类型，最大长度150字符，不能为空
    content = db.Column(db.Text, nullable=False)  # 帖子内容，文本类型，不能为空
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    # 用户 ID，整型，外键，引用 user 表（用户模型）中的 id 字段，不能为空
    attachment = db.Column(db.String(150), nullable=True)
    # 附件字段，字符串类型，最大长度150字符，可为空。用于存储帖子附件的文件路径
    # thumbnail = db.Column(db.String(120), nullable=True)  # 存储缩略图文件名
    comments = db.relationship('Comment', backref='post', lazy=True)
    # 帖子与评论模型的关系，一个帖子可以有多条评论。backref 在 Comment 模型中可以通过 `post` 字段反向访问该帖子
    created_at = db.Column(db.DateTime,  default=lambda: datetime.utcnow() + timedelta(hours=8))
    # 创建时间，DateTime 类型，默认值为创建时的当前东八区时间，记录帖子创建时间

    # def __init__(self, title, content, user_id, attachment=None):
    #     self.title = title
    #     self.content = content
    #     self.user_id = user_id
    #     self.attachment = attachment


class Comment(db.Model):
    # 评论模型，继承 db.Model
    id = db.Column(db.Integer, primary_key=True)  # 评论 ID，整型，主键，自动生成唯一标识
    content = db.Column(db.Text, nullable=False)  # 评论内容，文本类型，不能为空
    post_id = db.Column(db.Integer, db.ForeignKey('post.id', ondelete='CASCADE'), nullable=False)
    # 帖子 ID，整型，外键，引用 post 表（帖子模型）中的 id 字段，不能为空。ondelete='CASCADE' 表示当相关帖子被删除时自动删除该评论
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    # 用户 ID，整型，外键，引用 user 表（用户模型）中的 id 字段，不能为空，用于标识评论所属的用户
    attachment = db.Column(db.String(150), nullable=True)
    # 附件字段，字符串类型，最大长度150字符，可为空。用于存储评论附件的文件路径
    user = db.relationship('User', backref='comments')
    # 评论与用户模型的关系，一个用户可以有多条评论。backref 在 User 模型中可以通过 `comments` 字段反向访问用户的所有评论
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    # 创建时间，DateTime 类型，默认值为创建时的当前时间，记录评论创建时间

    # def __init__(self, content, post_id, user_id, attachment=None):
    #     self.content = content
    #     self.post_id = post_id
    #     self.user_id = user_id
    #     self.attachment = attachment
